/*______________________________________________________________________________
 *
 * Copyright 2005 NORSYS
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * (1) Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 * (2) Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in
 *     the documentation and/or other materials provided with the
 *     distribution.
 *
 * (3) The name of the author may not be used to endorse or promote
 *     products derived from this software without specific prior
 *     written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *______________________________________________________________________________
 *
 * Created on 15 nov. 2005
 * Author: Jean-Franois Hlie
 */
package speculoos.jndi.pool;

import java.util.Hashtable;
import java.util.Map;

import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * Ldap Factory that enables to pool ldap connection.
 * 
 * @author jeff
 * @version 0.1
 */
public class JNDIConnectionFactory implements ConnectionFactory {
	private static final Log log = LogFactory
			.getLog(JNDIConnectionFactory.class);

	/**
	 * Environnement of the connection
	 */
	private Map env;

	private int maximumConnection;
	
	private int currentConnection;
	
	public JNDIConnectionFactory(Map env) {
		this.env = env;
		this.currentConnection = 0;
		this.maximumConnection = JNDIPooledSource.DEFAULT_MAX_POOL;
	}

	/* (non-Javadoc)
	 * @see speculoos.jndi.pool.ConnectionFactory#makeObject()
	 */
	public synchronized DirContext connect() throws NamingException {
		if (log.isDebugEnabled())
			log.debug("connecting with env: "+env);
		if(currentConnection >= maximumConnection) {
			if (log.isDebugEnabled())
				log.debug("Maximum connection "+maximumConnection +" reached");
			return null;
		}
		DirContext obj = new InitialDirContext(new Hashtable(env));
		currentConnection++;
		if (log.isDebugEnabled())
			log.debug("done connecting: "+obj);
		return obj;
	}

	/* (non-Javadoc)
	 * @see speculoos.jndi.pool.ConnectionFactory#destroyObject(java.lang.Object)
	 */
	public synchronized void disconnect(DirContext obj) throws NamingException {
		if (log.isDebugEnabled())
			log.debug("disconnecting "+obj);
		((DirContext) obj).close();
		currentConnection--;
	}

	/**
	 * @return Returns the maximumConnection.
	 */
	public int getMaximumConnection() {
		return maximumConnection;
	}

	/**
	 * @param maximumConnection The maximumConnection to set.
	 */
	public void setMaximumConnection(int maximumConnection) {
		this.maximumConnection = maximumConnection;
	}

	/**
	 * @return Returns the currentConnection.
	 */
	public int getCurrentConnection() {
		return currentConnection;
	}

}